import {
	storageUtil
} from './storageUtil';
import {
	getGridCode,
	getSurroundingGrids
} from './getSurroundingGrids';
import store from '../store';
import * as msgAction from '@/utils/msgAction.js'


// 提取公共分页逻辑（从末尾往前取分页数据）

export default function chatFromStore(queryParam,user) {

	try {
		const {
			type,
			location,
			id
		} = queryParam || {};

		// 个人聊天
		if (type === 'person' && id) {
			// 1. 确保 id 有效（避免拼接无效 storeKey）
			if (!id || typeof id !== 'string' && typeof id !== 'number') {
				console.warn('个人聊天 ID 无效', id);
				return [];
			}

			const storeKey = `msg_person_${id}`;
			// 2. 获取存储数据并兜底（优先兜底空对象，避免非对象类型）
			let msgs = storageUtil.getByPrefix(storeKey);
			if (typeof msgs !== 'object' || msgs === null || Array.isArray(msgs)) {
				msgs = {}; // 非对象/数组/null 时，兜底空对象
			}

			// 3. 提取值并扁平化（处理可能的嵌套数组，确保返回一维数组）
			const msgValues = Object.values(msgs);
			const flatMsgs = Array.isArray(msgValues) ? msgValues.flat(Infinity) : [];

			// 4. 过滤无效消息（可选：排除非对象/无 timestamp 的异常数据）
			const validMsgs = flatMsgs.filter(msg =>
				typeof msg === 'object' && msg !== null && msg.timestamp !== undefined
			);

			// 5. 按时间戳排序（确保消息按时间顺序返回，可选但推荐）
			validMsgs.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0));
			validMsgs.forEach((item) => {
				if (!item.isRead) {
					msgAction.clearUnRead(item,user);
				}

			})
			return validMsgs;
		}
		// 公共聊天
		if (type === 'public'||type==="favorite") {
			// 验证 location 有效性
			if (!location || !location.latitude || !location.longitude) {
				console.warn('公共聊天需要有效的经纬度信息');
				return [];
			}
		
			const radius = store.state.msg.stateConfig.radius || 5;
			const gridCenter = getGridCode(queryParam.location);
			const surroundingGrids = getSurroundingGrids(gridCenter, radius);
			console.log('格子数量',surroundingGrids.length);
			const allPublicMsgs = storageUtil.getByPrefix('msg_public_') || {};

			let msgs = [];
			for (const [storeKey, gridMsgs] of Object.entries(allPublicMsgs)) {
				// 从 storeKey（如 'msg_public_123'）中提取网格码
				const gridCode = storeKey.split('msg_public_')[1];
				// 只保留目标网格的消息
				if (surroundingGrids.includes(gridCode)) {
					const values = Object.values(gridMsgs);
					const flatMsgs = Array.isArray(values) ? values.flat(Infinity) : [];
					msgs.push(...flatMsgs)
				}
			}
			if (msgs.length > 0) {
				msgs.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0));
			}
			msgs.forEach((item) => {
		
				if (!item.isRead) {
					msgAction.clearUnRead(item,user);
				}

			})
			return msgs;
		}

		// 群组聊天
		if (type === 'group' && id) {
			// 1. 确保 id 有效（避免拼接无效 storeKey）
			if (!id || typeof id !== 'string' && typeof id !== 'number') {
				console.warn('群组聊天 ID 无效', id);
				return [];
			}

			const storeKey = `msg_group_${id}`;
			// 2. 获取存储数据并兜底（优先兜底空对象，避免非对象类型）
			let msgs = storageUtil.getByPrefix(storeKey);
			if (typeof msgs !== 'object' || msgs === null || Array.isArray(msgs)) {
				msgs = {}; // 非对象/数组/null 时，兜底空对象
			}

			// 3. 提取值并扁平化（处理可能的嵌套数组，确保返回一维数组）
			const msgValues = Object.values(msgs);
			const flatMsgs = Array.isArray(msgValues) ? msgValues.flat(Infinity) : [];

			// 4. 过滤无效消息（可选：排除非对象/无 timestamp 的异常数据）
			const validMsgs = flatMsgs.filter(msg =>
				typeof msg === 'object' && msg !== null && msg.timestamp !== undefined
			);

			// 5. 按时间戳排序（确保消息按时间顺序返回，可选但推荐）
			validMsgs.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0));
			validMsgs.forEach((item) => {
				if (!item.isRead) {
					msgAction.clearUnRead(item,user);
				}

			})
			return validMsgs;
		}

		// 未匹配类型返回空数组
		return [];


	} catch (e) {
		throw e
	}

}